package com.sisgesbyte.dao.ventas;

import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.dao.beanDao.VentasRequest;
import com.sisgesbyte.dao.utilDao.CreaFiltroSqlString;
import com.sisgesbyte.data.entity.comun.GenericEntity;
import com.sisgesbyte.data.entity.ventas.VentaTotalEntity;
import com.sisgesbyte.data.entity.ventas.VentasEntity;
import com.sisgesbyte.data.entity.ventas.VentasPeriodoEntity;
import com.sisgesbyte.data.util.AbstractFacade;

@Stateless
public class ConsultaVentasDaoImpl extends AbstractFacade<VentasPeriodoEntity> implements ConsultaVentasDao {

	@Inject
	private CreaFiltroSqlString creaFiltroSqlString;
	
	@PersistenceContext(unitName = "SigesSiscompPU")
	private EntityManager em;

	@Override
	protected EntityManager getEntityManager() {
		return em;
	}
	
	public ConsultaVentasDaoImpl(){
		super(VentasPeriodoEntity.class);
	}
	/*
	 * Lista de Total de ventas por periodo
	 * **/
	@Override
	public List<VentasPeriodoEntity> ventasTotalPorPeriodo(int codPeriodo) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("select v.periodo_id, sum(dv.total) totalventa ");
		jpql.append("from ventas.detalle_venta dv inner ");
		jpql.append("join ventas.ventas v on dv.venta_id=v.id ");
		jpql.append("where dv.bonificacion=false ");//validamos que solo obtengamos las ventas que no sean bonificaciones
		if(codPeriodo > 0){
			jpql.append("and v.periodo_id = :idperiodo ");
		}
		jpql.append("group by v.periodo_id ");
		
		Query query = em.createNativeQuery(jpql.toString(), VentasPeriodoEntity.class);
		if(codPeriodo >0){
			query.setParameter("idperiodo", codPeriodo);
		}
		List<VentasPeriodoEntity> ls = query.getResultList();

		return ls;
	}

	@Override
	public VentaTotalEntity ventaTotal() {
		StringBuilder jpql = new StringBuilder();
		jpql.append("select sum(dv.total) total_avance_venta ");
		jpql.append("from ventas.detalle_venta dv inner ");
		jpql.append("join ventas.ventas v on dv.venta_id=v.id  ");
		jpql.append("where dv.bonificacion=false  ");
		Query query = em.createNativeQuery(jpql.toString(), VentaTotalEntity.class);

		return (VentaTotalEntity) query.getSingleResult();
	}

	@Override
	public List<VentasEntity> listaVentasDetalle(FiltrosSQLBean cadenaFiltros) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("SELECT detalle_venta_id,venta_id,periodo_id, vendedor_id,codigo_vendedor,nombre_vendedor,apellido_vendedor,tipo_identificacion_id,razon_social,num_doc,nombre_cliente, ");
		jpql.append("apellido_cliente, cliente_id, num_documento,num_lote, categoria_cliente_id, cliente_locales_id, cod_local,zona_id, fecha_venta, ");
		jpql.append("categoria_producto_id, producto_id,cod_prod,producto, cantidad, subtotal, total,  bonificacion ");
		jpql.append("FROM ventas.v_ventas ");
		// concatenamos el filtro
		if (cadenaFiltros != null) {
			StringBuilder filtro = new StringBuilder();
			filtro.append(creaFiltroSqlString.concatenar(cadenaFiltros));
			jpql.append(filtro.toString());
		}
		Query query = em.createNativeQuery(jpql.toString(), VentasEntity.class);
		if (cadenaFiltros != null && cadenaFiltros.getListaValores() != null
				&& cadenaFiltros.getListaValores().size() > 0) {
			int num = 0;
			for (Object valor : cadenaFiltros.getListaValores()) {
				query.setParameter(++num, valor);
			}
		}
		List<VentasEntity> ls = query.getResultList();

		return ls;
	}

	@Override
	public GenericEntity RegistrarVentasMasivo(VentasRequest request) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("SELECT * from ventas.sp_registrar_ventas_masivo(:in_periodo_id, :in_cliente_id , :in_local_id, :in_vendedor_id, ");
		jpql.append(":in_fecha_venta,:in_tipo_documento,:in_num_lote,:in_num_documento,:in_tipo_venta_id,:in_estado_doc_id,:in_producto_id,:in_cantidad,:in_subtotal,:in_total )");

		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
			query.setParameter("in_periodo_id", request.getIdPeriodo());
			query.setParameter("in_cliente_id", request.getIdCliente());
			query.setParameter("in_local_id", request.getIdLocalCliente());
			query.setParameter("in_vendedor_id", request.getIdVendedor());
			query.setParameter("in_fecha_venta", request.getFechaVenta());
			query.setParameter("in_tipo_documento", request.getIdTipoDocumento());
			query.setParameter("in_num_lote", request.getNumeroLote());
			query.setParameter("in_num_documento", request.getNumerodocumento());
			query.setParameter("in_tipo_venta_id", request.getIdTipoVenta());
			query.setParameter("in_estado_doc_id", request.getIdEstadoDocumento());
			query.setParameter("in_producto_id", request.getIdProducto());
			query.setParameter("in_cantidad", request.getCantidadProductos());
			query.setParameter("in_subtotal", request.getSubtotal());
			query.setParameter("in_total", request.getTotal());

		return (GenericEntity) query.getSingleResult();
	}

}
